Unityでzipを使って圧縮データを作る
概要
SharpZipLibを使って、Unity内でデータを圧縮する。
下記ライブラリが有用。
https://github.com/icsharpcode/SharpZipLib
用途
書き溜めたログファイルを圧縮して送りたくなったよ!!
という異端な用途を満たしたい欲求からスタート。
手段
ローカルでファイルに吐き出す必要は無いので、
path -> byte []
byte [] -> byte []
なものをサクッと用意してみる。
コード
ビルドすると下記libができるので、
ICSharpCode.SharpZipLib.dll
これと下記コードで。
/**
compress data from path
*/
public static byte [] ZipFromFile(string filePath) {
using (var fileStreamIn = new FileStream(filePath, FileMode.Open, FileAccess.Read)) {
using (var memoryStreamOut = new MemoryStream()) {
using (ZipOutputStream zipOutStream = new ZipOutputStream(memoryStreamOut)) {
byte[] buffer = new byte[4096];
// get zipped-file name from filePath.
var name = Path.GetFileName(filePath);
ZipEntry entry = new ZipEntry(name);
entry.DateTime = DateTime.Now;
zipOutStream.PutNextEntry(entry);
int size;
do {
size = fileStreamIn.Read(buffer, 0, buffer.Length);
zipOutStream.Write(buffer, 0, size);
} while (size > 0);
zipOutStream.Finish();
zipOutStream.Close();
}
return memoryStreamOut.ToArray();
}
}
}
/**
compress data from bytes
*/
public static byte [] ZipFromBytes(byte [] data, string asName="DEFAULT_NAME") {
using (var memoryStreamIn = new MemoryStream(data)) {
using (var memoryStreamOut = new MemoryStream()) {
using (ZipOutputStream zipOutStream = new ZipOutputStream(memoryStreamOut)) {
byte[] buffer = new byte[4096];
ZipEntry entry = new ZipEntry(asName);
entry.DateTime = DateTime.Now;
zipOutStream.PutNextEntry(entry);
int size;
do {
size = memoryStreamIn.Read(buffer, 0, buffer.Length);
zipOutStream.Write(buffer, 0, size);
} while (size > 0);
zipOutStream.Finish();
zipOutStream.Close();
}
return memoryStreamOut.ToArray();
}
}
}
内容は適当なので、ブラッシュアップとかしたい。
ともあれ
path -> zipped byte []
byte [] -> zipped byte []
が出来る感じ。
アイドル自由入力行
dfgfgっhjきzdgfdfgvbhじこ
↑アイドルがかってにかきました。